package main

import "fmt"

func main() {
	// 定义匿名函数
	runFn := func(fn func()) {
		fn()
	}
	// 匿名函数作为参数
	runFn(func() {})
	runing := func() {
		fmt.Println("runing")
	}
	runFn(runing)

	// Go语言闭包
	// 闭包（Closure）是一个函数值，它引用了其函数体之外的变量。
	// 闭包使得函数可以访问并操作函数外部的变量。
	count := 0
	increment := func() int {
		count++
		return count
	}

	fmt.Println(increment()) // 输出: 1
	fmt.Println(increment()) // 输出: 2
	fmt.Println(increment()) // 输出: 3
}

// 语法层（源码）
// Go 只给你 包级 flat 函数 + 匿名 func 字面量；不允许写嵌套的 func foo() {}，保持静态世界简单 ABI。
// 语义层（运行时）
// 只要出现 匿名 func 字面量并且捕获了外层变量，编译器立刻把它提升为闭包（胖指针 {代码地址, 环境}），变量寿命由 逃逸分析 + GC 自动延长——半动态。
